mod draw;
mod screen;
mod components;

use crate::draw::{draw_boxed, draw_borrowed};
use crate::screen::{Screen, GenericScreen};
use crate::components::{Button, SelectBox};

fn main() {
    // 使用 f64 与 u8 演示：它们虽为基础类型，但实现了 Draw。
    let x = 1.1f64;
    let y = 8u8;

    // 将 Box<f64> 自动转换为 Box<dyn Draw>，触发动态分发。
    draw_boxed(Box::new(x));
    // 将 Box<u8> 自动转换为 Box<dyn Draw>。
    draw_boxed(Box::new(y));
    // 将 &f64 借用为 &dyn Draw，不转移所有权。
    draw_borrowed(&x);
    draw_borrowed(&y);

    // 构造异构组件集合：Button 与 SelectBox 共存。
    let screen = Screen {
        components: vec![
            // Box::new 使组件分配在堆上，并转为特征对象。
            Box::new(SelectBox {
                width: 75,
                height: 10,
                options: vec![
                    String::from("Yes"),
                    String::from("Maybe"),
                    String::from("No"),
                ],
            }),
            Box::new(Button {
                width: 50,
                height: 10,
                label: String::from("OK"),
            }),
        ],
    };

    // 运行时，Screen::run 会遍历组件并调用 draw（动态分发）。
    screen.run();

    // 构造只包含 Button 的泛型 Screen，演示静态分发。
    let generic_screen = GenericScreen {
        components: vec![
            Button {
                width: 120,
                height: 32,
                label: String::from("Submit"),
            },
            Button {
                width: 90,
                height: 32,
                label: String::from("Cancel"),
            },
        ],
    };

    // 运行泛型版本，编译期已知类型，仅对 Button 进行遍历渲染。
    generic_screen.run();
}